package com.cinema.controller;

import com.cinema.CinemaManagementSystem;
import com.cinema.model.User;
import com.cinema.model.UserType;
import com.cinema.service.UserService;
import com.cinema.util.InputUtil;
import com.cinema.util.LogUtil;

/**
 * 主控制器
 * 负责系统启动和用户登录流程管理
 */
public class MainController {
    private final UserService userService;
    private AdminController adminController;
    private ManagerController managerController;
    private UserController userController;

    public MainController() {
        this.userService = new UserService();
    }

    /**
     * 启动系统主循环
     */
    public void start() {
        boolean running = true;
        
        while (running) {
            try {
                displayMainMenu();
                int choice = InputUtil.readInt("请选择操作: ", 0, 3);
                
                switch (choice) {
                    case 1:
                        handleLogin();
                        break;
                    case 2:
                        displaySystemInfo();
                        break;
                    case 3:
                        if (InputUtil.readConfirmation("确定要退出系统吗？")) {
                            running = false;
                        }
                        break;
                    case 0:
                        displayHelp();
                        break;
                    default:
                        System.out.println("无效选择，请重新输入！");
                        InputUtil.pauseForUser();
                }
            } catch (Exception e) {
                System.out.println("系统运行出现错误: " + e.getMessage());
                LogUtil.logError("主控制器", "系统运行错误: " + e.getMessage());
                InputUtil.pauseForUser();
            }
        }
    }

    /**
     * 显示主菜单
     */
    private void displayMainMenu() {
        InputUtil.clearScreen();
        InputUtil.printTitle("万东影院管理系统");
        
        System.out.println("1. 用户登录");
        System.out.println("2. 系统信息");
        System.out.println("3. 退出系统");
        System.out.println("0. 帮助信息");
        
        InputUtil.printSeparator();
    }

    /**
     * 处理用户登录
     */
    private void handleLogin() {
        InputUtil.printTitle("用户登录");
        
        try {
            String username = InputUtil.readNonEmptyString("请输入用户名: ");
            String password = InputUtil.readPassword("请输入密码: ");
            
            if (userService.login(username, password)) {
                User currentUser = userService.getCurrentUser();
                System.out.println("登录成功！欢迎您，" + currentUser.getUsername() + 
                                 " (" + currentUser.getUserType().getDescription() + ")");
                
                // 检查是否需要修改密码
                if (userService.needPasswordChange()) {
                    handleFirstTimePasswordChange();
                }
                
                // 根据用户类型跳转到对应菜单
                redirectToUserMenu(currentUser);
                
                // 退出时登出
                userService.logout();
                
            } else {
                System.out.println("登录失败！用户名或密码错误。");
                InputUtil.pauseForUser();
            }
            
        } catch (Exception e) {
            System.out.println("登录过程发生错误: " + e.getMessage());
            LogUtil.logError("用户登录", "登录错误: " + e.getMessage());
            InputUtil.pauseForUser();
        }
    }

    /**
     * 处理首次登录修改密码
     */
    private void handleFirstTimePasswordChange() {
        InputUtil.printTitle("强制修改密码");
        
        System.out.println("检测到您需要修改密码，请设置新密码后继续使用系统。");
        
        try {
            String newPassword = InputUtil.readPasswordWithConfirmation("请输入新密码: ");
            
            if (userService.forceChangePassword(newPassword)) {
                System.out.println("密码修改成功！");
                InputUtil.pauseForUser();
            } else {
                System.out.println("密码修改失败，请联系管理员。");
                InputUtil.pauseForUser();
                // 修改失败则退出登录
                userService.logout();
                return;
            }
            
        } catch (Exception e) {
            System.out.println("修改密码时发生错误: " + e.getMessage());
            InputUtil.pauseForUser();
            userService.logout();
        }
    }

    /**
     * 根据用户类型跳转到对应菜单
     */
    private void redirectToUserMenu(User user) {
        try {
            switch (user.getUserType()) {
                case ADMIN:
                    // 确保管理员控制器已初始化
                    if (adminController == null) {
                        adminController = new AdminController(userService);
                    }
                    adminController.showAdminMenu();
                    break;
                case MANAGER:
                    // 确保经理控制器已初始化
                    if (managerController == null) {
                        managerController = new ManagerController();
                    }
                    managerController.showMenu(user);
                    break;
                case USER:
                    // 确保用户控制器已初始化
                    if (userController == null) {
                        userController = new UserController();
                    }
                    userController.showMenu(user);
                    break;
                default:
                    System.out.println("未知用户类型！");
                    InputUtil.pauseForUser();
            }
        } catch (Exception e) {
            System.out.println("跳转到用户菜单时发生错误: " + e.getMessage());
            LogUtil.logError("菜单跳转", "错误: " + e.getMessage());
            InputUtil.pauseForUser();
        }
    }

    /**
     * 显示系统信息
     */
    private void displaySystemInfo() {
        InputUtil.printTitle("系统信息");
        
        CinemaManagementSystem.showSystemInfo();
        
        InputUtil.pauseForUser();
    }
    
    /**
     * 显示帮助信息
     */
    private void displayHelp() {
        InputUtil.printTitle("帮助信息");
        
        System.out.println("欢迎使用万东影院管理系统！");
        System.out.println();
        System.out.println("快速开始：");
        System.out.println("1. 使用默认管理员账户登录：");
        System.out.println("   用户名：admin");
        System.out.println("   密码：ynuinfo#777");
        System.out.println();
        System.out.println("2. 登录后可以进行以下操作：");
        System.out.println("   • 管理员：用户管理、密码管理、系统管理");
        System.out.println("   • 经理：影片管理、排片管理、销售统计");
        System.out.println("   • 用户：查看影片、售票、退票");
        System.out.println();
        System.out.println("3. 系统特性：");
        System.out.println("   • 支持5个放映厅管理");
        System.out.println("   • 完整的票务销售流程");
        System.out.println("   • 详细的操作日志记录");
        System.out.println("   • 数据持久化存储");
        System.out.println();
        System.out.println("如有问题，请查看系统日志或联系系统管理员。");
        
        InputUtil.pauseForUser();
    }
}